using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using VitServer;

namespace protoNet
{
    public delegate void RecieveMsgHandler(object msg);

    public class MsgReader
    {
        private MsgReader() { }

        // 保存所有等待服务器返回消息的回调, key: msgID
        private static Dictionary<int, RecieveMsgHandler> dic_id_callback;

        // 注册接到消息的回调
        public static void OnMessageRecieved(GAME_PROTOCOL_MSG_ID msgId, RecieveMsgHandler callback)
        {
            if (dic_id_callback == null)
            {
                dic_id_callback = new Dictionary<int, RecieveMsgHandler>();
            }
            dic_id_callback.Add(Convert.ToInt32(msgId), callback);
        }

        // 收到服务器返回的消息时统一调用
        public static void ReadMessage(byte[] bytes)
        {
            // 消息长度
            int BytesConst = 0;
            BytesConst |= bytes[0] << 24;
            BytesConst |= bytes[1] << 16;
            BytesConst |= bytes[2] << 8;
            BytesConst |= bytes[3] << 0;
            _G.Print("Message analyzing, Length = " + BytesConst);
            // 消息号
            int IDConst = 0;
            IDConst |= bytes[4] << 24;
            IDConst |= bytes[5] << 16;
            IDConst |= bytes[6] << 8;
            IDConst |= bytes[7] << 0;
            string msgName = Convert.ToString((GAME_PROTOCOL_MSG_ID)IDConst);
            _G.Print("Message analyzing, ID = " + msgName);
            // 截取包体
            byte[] _buffer = new byte[BytesConst];
            int j = 8;
            for (int i = 0; i < BytesConst; i++, j++)
            {
                _buffer[i] = bytes[j];
            }

            // 反序列化包体
            object obj = new Deserialize(_buffer);
            // arg2传入buffer，在read函数中进行解析，由于服务器返回的包体不固定，所以要进行特别解析
            object dataInfo = obj.GetType().GetMethod("Deserialize" + msgName).Invoke(obj, new object[0]);
            //调用注册函数
            foreach (KeyValuePair<int, RecieveMsgHandler> kvp in dic_id_callback)
            {
                if (kvp.Key == IDConst)
                {
                    kvp.Value(dataInfo);
                }
            }
        }
    }
}
